﻿#ifndef DEFINE_HQH
#define DEFINE_HQH

#include <QDateTime>
#include <QObject>
#include <QString>
#ifdef USING_ALG_OPENCV
#include <opencv2/opencv.hpp>
#endif
#ifdef  USING_ALG_HALCON
#include "HalconCpp.h"
#endif

#ifndef INT8
// typedef char            	INT8;
#endif

namespace NjGreat
{
/**@brief 文档输出格式 */
enum FileNameFormat {
    Nm_Shift,               //!< 班次
    Nm_Task,                //!< 任务名
    Nm_Product,             //!< 产品名
    Nm_Part = Nm_Product,   //!< 料号
    Nm_Date1,               //!< 年月日
    Nm_Date2,               //!< 年-月-日
    Nm_Date3,               //!< 年_月_日
    Nm_Time1,               //!< 时分秒
    Nm_Time2,               //!< 时-分-秒
    Nm_Time3,               //!< 时_分_秒
    Nm_TimeMs,              //!< 微秒
};
QString enumFileNameOutput(FileNameFormat e) {
    switch (e) {
    case Nm_Shift: return QObject::tr("Shift"); break;
    case Nm_Task: return QObject::tr("Task"); break;
    case Nm_Product: return QObject::tr("Product"); break;
    case Nm_Date1: return QDateTime::currentDateTime().toString("yyyyMMdd"); break;
    case Nm_Date2: return QDateTime::currentDateTime().toString("yyyy-MM-dd"); break;
    case Nm_Date3: return QDateTime::currentDateTime().toString("yyyy_MM_dd"); break;
    case Nm_Time1: return QDateTime::currentDateTime().toString("HHmmss"); break;
    case Nm_Time2: return QDateTime::currentDateTime().toString("HH-mm-ss"); break;
    case Nm_Time3: return QDateTime::currentDateTime().toString("HH_mm_ss"); break;
    case Nm_TimeMs: return QDateTime::currentDateTime().toString("zzz"); break;
    }
    return nullptr;
}
QString enumFileNameDisplay(FileNameFormat e) {
    switch (e) {
    case Nm_Shift: return QObject::tr("Shift"); break;
    case Nm_Task: return QObject::tr("Task"); break;
    case Nm_Product: return QObject::tr("Product"); break;
    case Nm_Date1: return QObject::tr("yyyyMMdd"); break;
    case Nm_Date2: return QObject::tr("yyyy-MM-dd"); break;
    case Nm_Date3: return QObject::tr("yyyy_MM_dd"); break;
    case Nm_Time1: return QObject::tr("HHmmss"); break;
    case Nm_Time2: return QObject::tr("HH-mm-ss"); break;
    case Nm_Time3: return QObject::tr("HH_mm_ss"); break;
    case Nm_TimeMs: return QObject::tr("zzz"); break;
    }
    return nullptr;
}
int enumFileNameConvert(const QString &formatStr) {
    if (0 == formatStr.compare(QObject::tr("Shift"))) return Nm_Shift;
    if (0 == formatStr.compare(QObject::tr("Task"))) return Nm_Task;
    if (0 == formatStr.compare(QObject::tr("Product")) * formatStr.compare(QObject::tr("Part"))) return Nm_Product;
    if (0 == formatStr.compare(QObject::tr("yyyyMMdd"))) return Nm_Date1;
    if (0 == formatStr.compare(QObject::tr("yyyy-MM-dd"))) return Nm_Date2;
    if (0 == formatStr.compare(QObject::tr("yyyy_MM_dd"))) return Nm_Date3;
    if (0 == formatStr.compare(QObject::tr("HHmmss"))) return Nm_Time1;
    if (0 == formatStr.compare(QObject::tr("HH-mm-ss"))) return Nm_Time2;
    if (0 == formatStr.compare(QObject::tr("HH_mm_ss"))) return Nm_Time3;
    if (0 == formatStr.compare(QObject::tr("zzz"))) return Nm_TimeMs;

    return -1;
}
/**@brief       : 格式路径的转换
 * @details     : 从一个带有格式的文件或文件夹的路径,转换成有效的路径
 * @author      : HaoQinghui
 * @param       : filePathWithFormat: 带格式的路径
 * @return      : 转换后的正常路径
 * @output      : datas:读取到的数据
 * @date        : 2024-04-29 08:57:15
 * @modify      : 日期加修改描述
 */
QString getFilePath(const QString &filePathWithFormat) {
    auto tmpPath = filePathWithFormat;
    while (tmpPath.contains('[')) {
        auto i = tmpPath.indexOf('[');
        auto oldC = tmpPath.mid(i, tmpPath.indexOf(']') - i + 1);
        auto newC = oldC.mid(1, oldC.length() - 2);
        auto findId = enumFileNameConvert(newC);
        if (findId != -1) {
            tmpPath.replace(oldC, enumFileNameOutput((NjGreat::FileNameFormat)findId));
        } else {
            tmpPath.replace(oldC, newC);
        }
    }
    return tmpPath;
}
};

struct IMAGE_DATA
{
    QString         imageFileName;          //!< 图片路径名1
    bool            inferResult;            //!< 推理结果<True:OK/False:NG>
    QString         ngDescribe;             //!< NG病害描述
#ifdef USING_ALG_OPENCV
    cv::Scalar      rectColor;
    std::vector<cv::Point> ngPointList;     //!< 病害区域组(容器长度为偶数，一个病害区是两个点；如无病害容器长度为0)
    cv::Mat         imageDataPtr;           //!< 图片数据
#endif
#ifdef USING_ALG_HALCON
    HalconCpp::HObject  imageDataPtr;
#endif // USING_ALG_HALCON
    IMAGE_DATA() : IMAGE_DATA("", "") {}
    IMAGE_DATA(QString image, QString ngDes) :
        imageFileName(image),
        inferResult(true),
        ngDescribe(ngDes) {
#ifdef USING_ALG_OPENCV
        ngPointList.clear();
#endif
    }
};
// 在全局范围内注册你的结构体
//Q_DECLARE_METATYPE(IMAGE_DATA)

class WeaponParts
{
public:
    //QString     devName;            //!< 配件名
    double      vibrationCoe;       //!< 抗振系数
    double      accuracyCoe;        //!< 精准系数
};

/**\ @brief 基础武器*/
class BaseWeapon
{
public:
    // ---- 基础参数 ----
    //QString     devName;            //!< 武器名
    bool        isCanAutoAttack;    //!< 是否具备自动攻击的功能
    bool        isAutoFire;         //!< 是否开启自动开火
    bool        isUnmanned;         //!< 是否属于无人武器
    int         soldiersNum;        //!< 需要士兵数
    int         injuryNum;          //!< 最大承伤数(攻击力>=本值,武器报废)

    double      beidou_x,
    beidou_y,
    beidou_z;

    // ---- 移动参数 ----
    double      moveSpeedMax;       //!< 移动速度
    double      moveSpeedCurr;      //!< 当前移动速度

    // ---- 攻击参数 ----
    int         ammunitionNumOwn;   //!< 领取/拥有的弹药总数
    int         ammunitionNumMax;   //!< 最大弹药数
    int         ammunitionNumCurr;  //!< 当前弹药数
    int         attackDistance;     //!< 最远攻击距离
    double      baseAttackPower;    //!< 基础攻击力(原始)

    // ---- 环境参数 ----
    //注: PRAP: Percentage reduction in attack power
    double      attackBuff;         //!< 攻击力增益
    double      attackDebuff;       //!< 攻击力减益
    double      accuracyBuff;       //!< 精准度增益
    double      accuracyDebuff;     //!< 精准度减益

    bool        envIsDesert;        //!< 干扰减比(沙漠)
    bool        envIsForest;        //!< 干扰减比(森林)
    bool        envIsHill;          //!< 干扰减比(山区)
    bool        envIsRiver;         //!< 干扰减比(小河,浅滩)
    bool        envIsSea;           //!< 干扰减比(深水,大海)
    bool        envIsSnow;          //!< 干扰减比(雪地)

    bool        weaIsfoggy;         //!< 大雾天减比
    bool        weaIsStormy;        //!< 暴雨天减比
    bool        weaIsNight;         //!< 深夜减比
};

/**\ @brief 火炮类武器*/
class BaseCannon : public BaseWeapon
{
public:
    double      attackInterval;     //!< 射击间隔(射速)
    double      loadInterval;       //!< 装弹间隔(装弹速度,单发)
};

/**\ @brief 步枪类武器*/
class BaseRifle : public BaseWeapon
{
public:
    int         mGlass;             //!< 倍镜数量
    double      loadInterval;       //!< 装弹间隔(装弹速度,单发)
};

#pragma pack()

/**\
\brief 自定义断言
*/
#ifdef QT_NO_DEBUG
#define DEBUG_STOP
#else
#define DEBUG_STOP    {asm("int $3");}
#endif
#define  IQS_ASSERT  2
#if  IQS_ASSERT == 1
#define  iQsAssert      Q_ASSERT
#elif  IQS_ASSERT == 2
#define  iQsAssert(cond)  {\
    if(!(cond)) {\
    qCritical("ASSERT: %s in %s (%s:%u)",#cond, Q_FUNC_INFO, __FILE__, __LINE__); \
    DEBUG_STOP \
    }\
    }
#else
#define  iQsAssert(cond)    {}
#endif

#endif // DEFINE_HQH
